package com.example.alphabetindexer.util;


/**
 * 日志输入
 * 
 * @author atearsan/2013年7月16日
 * 
 */
public final class Log {
	private static boolean debug = true;
	private static String TAG;

	public static boolean isDebug() {
		return debug;
	}

	public static void v(String msg) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.v(TAG, s);
		}
	}

	public static void v(Throwable e) {
		if (debug) {
			String s = buildMessage();
			android.util.Log.v(TAG, s, e);
		}
	}

	public static void v(String msg, Throwable e) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.v(TAG, s, e);
		}
	}

	public static void d(String msg) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.d(TAG, s);
		}
	}

	public static void d(Throwable e) {
		if (debug) {
			String s = buildMessage();
			android.util.Log.d(TAG, s, e);
		}
	}

	public static void d(String msg, Throwable e) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.d(TAG, s, e);
		}
	}

	public static void i(String msg) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.i(TAG, s);
		}
	}

	public static void i(String msg, Throwable e) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.i(TAG, s, e);
		}
	}

	public static void i(Throwable e) {
		if (debug) {
			String s = buildMessage();
			android.util.Log.i(TAG, s, e);
		}
	}

	public static void w(String msg) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.w(TAG, s);
		}
	}

	public static void w(Throwable e) {
		if (debug) {
			String s = buildMessage();
			android.util.Log.w(TAG, s, e);
		}
	}

	public static void w(String msg, Throwable e) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.w(TAG, s, e);
		}
	}

	public static void e(String msg) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.e(TAG, s);
		}
	}

	public static void e(Throwable e) {
		if (debug) {
			String s = buildMessage();
			android.util.Log.e(TAG, s, e);
		}
	}

	public static void e(String msg, Throwable e) {
		if (debug) {
			String s = buildMessage(msg);
			android.util.Log.e(TAG, s, e);
		}
	}

	protected static String buildMessage() {
		return buildMessage(StringTools.EMPTY);
	}

	protected static String buildMessage(String msg) {
		StackTraceElement caller = new Throwable().fillInStackTrace().getStackTrace()[2];
		
		TAG = caller.getClassName();
		//int index = TAG.lastIndexOf(".");
		// index > tag.length()
		// atearsan/2013-07-22 加这个是有时候, 是有时候! 出现index小于tag.length()的情况. 然后会报下标越界.
		// atearsan/2013-07-24 突然发现 index > TAG.length() 有点逻辑不对. 不如直接用完整类名做tag算了
		//if (index > 0 && index > TAG.length()) {
		//	TAG = TAG.substring(index + 1);
		//}
		return String.format(
				"[method:%s, lineNumber:%d]:%s",
				new Object[] { caller.getMethodName(), caller.getLineNumber(), msg });
	}
}